#!/bin/bash
# * =====================================================
# * Copyright © hk. 2022-2025. All rights reserved.
# * File name  : 2.sh
# * Author     : 上上签
# * Date       : 2023-07-02
# * ======================================================
##

BLACK="\033[1;30m"
RED='\033[1;31m'    # 红
GREEN='\033[1;32m'  # 绿
YELLOW='\033[1;33m' # 黄
BLUE='\033[1;34m'   # 蓝
PINK='\033[1;35m'   # 紫
CYAN='\033[1;36m'   # 青
WHITE='\033[1;37m'  # 白
CLS='\033[0m'       # 清除颜色

INFO="${GREEN}INFO  ${CLS}"
WARN="${YELLOW}WARN  ${CLS}"
ERR="${RED}ERROR  ${CLS}"

# 路径定义
CURRENT_PATH=$(pwd)
SCRIPT_ROOT_PATH=$(pwd)
LOCAL_NOTE_ROOT_PATH=/d/我的博客文章
PICTURE_ROOT_PATH=${LOCAL_NOTE_ROOT_PATH}/00oss_picture

REMOTE_NOTE_ROOT_PATH=/d/MyLinux/01MyBlog/FanhuaBlog
REMOTE_NOTE_POST_PATH=${REMOTE_NOTE_ROOT_PATH}/source/_posts

NOTE_RELATIVE_PATH=01嵌入式开发/01HQ课程体系/LV100-笔记处理测试

LOCAL_NOTE_PATH=${LOCAL_NOTE_ROOT_PATH}/${NOTE_RELATIVE_PATH}   # 要处理的笔记的本地目录
REMOTE_NOTE_PATH=${REMOTE_NOTE_POST_PATH}/${NOTE_RELATIVE_PATH} # 要处理的笔记的博客所在目录
PICTURE_NOTE_PATH=${PICTURE_ROOT_PATH}/${NOTE_RELATIVE_PATH}    # 要处理的笔记图片目标目录

LOCAL_NOTE_ARR=()     # 本地笔记名称列表
PY_WRITE_NOTE_ARR=()

TAGS_DATA=( "\  - LV100-笔记处理测试")
CATEGORIES_DATA=( "\  - 嵌入式开发"
                  "\  - 01HQ课程体系"
                  "\  - LV100-笔记处理测试")

# 数组倒序处理，因为插入的时候是倒着插入的
function arr_reserve()
{
    length=${#TAGS_DATA[*]}
    for ((i=0;i<$length/2;i++))
        do
            temp=${TAGS_DATA[${i}]}
            TAGS_DATA[${i}]=${TAGS_DATA[${length}-${i}-1]}
            TAGS_DATA[${length}-${i}-1]=${temp}
        done
    
    length=${#CATEGORIES_DATA[*]}
    for ((i=0;i<$length/2;i++))
        do
            temp=${CATEGORIES_DATA[${i}]}
            CATEGORIES_DATA[${i}]=${CATEGORIES_DATA[${length}-${i}-1]}
            CATEGORIES_DATA[${length}-${i}-1]=${temp}
        done
}

# 获取后缀为 md 的文件
check_suffix()
{
    local FILE_TEMP=$1
    if [ "${FILE_TEMP##*.}"x = "md"x ];then
        LOCAL_NOTE_ARR[${#LOCAL_NOTE_ARR[*]}]=${FILE_TEMP##*/}
    fi    
}

#递归遍历
traverse_dir()
{
    local FILE_PATH_TEMP=$1
    for file in `ls -a $FILE_PATH_TEMP`
    do
        if [ -d ${FILE_PATH_TEMP}/$file ];then
            if [[ $file != '.' && $file != '..' ]];then
                traverse_dir ${FILE_PATH_TEMP}/$file  #递归
            fi
        else
            check_suffix ${FILE_PATH_TEMP}/$file #调用查找指定后缀文件
        fi
    done
}

function echo_menu()
{
    echo "================================================="
    echo -e "${INFO}CURRENT_PATH     = ${CURRENT_PATH}"
    echo -e "${INFO}LOCAL_NOTE_PATH  = ${LOCAL_NOTE_PATH}"
    echo -e "${INFO}REMOTE_NOTE_PATH = ${REMOTE_NOTE_PATH}"
    echo -e "${INFO}PICTURE_NOTE_PATH= ${PICTURE_NOTE_PATH}"
    echo -e "${INFO}note number     = ${PINK}${#LOCAL_NOTE_ARR[*]}${CLS}"
    echo ""
    echo -e "${GREEN} * [0] 文章处理${CLS}"
    echo -e "${GREEN} * [1] 图片处理${CLS}"
    echo "================================================="
}

function note_process()
{
    # 如果远程博客中对应的目录不存在，创建对应的目录
    if [ ! -d "${REMOTE_NOTE_PATH}" ]; then
        echo -e "${WARN}${REMOTE_NOTE_PATH} 不存在，即将创建..."
        mkdir -p ${REMOTE_NOTE_PATH}
        echo -e "${INFO}${REMOTE_NOTE_PATH} 创建完成..."
    else
        echo -e "${INFO}${REMOTE_NOTE_PATH} 已存在存在，可正常使用..."
    fi

    # 开始处理博客目录中的文章
    cd ${REMOTE_NOTE_PATH}
    echo -e "${INFO}CURRENT_PATH    = $(pwd)"

    for temp in ${LOCAL_NOTE_ARR[@]}
        do
            if [ ! -e "${REMOTE_NOTE_PATH}/${temp}" ];then
                hexo_cmd_file_name=${temp%.*}
                echo -e "${INFO}正在创建 ${hexo_cmd_file_name}, 请稍等..."
                hexo n ${hexo_cmd_file_name} --silent
                mv ${REMOTE_NOTE_POST_PATH}/${temp} ${REMOTE_NOTE_PATH}
                echo -e "${INFO}${hexo_cmd_file_name} 已创建完成..."
                # 添加标签和分类
                for data_temp in "${TAGS_DATA[@]}"
                    do
                        sed -i "/tags:/a${data_temp}" ${temp}
                    done
                for data_temp in "${CATEGORIES_DATA[@]}"
                    do
                        sed -i "/categories:/a${data_temp}" ${temp}
                    done
            else
                echo -e "${WARN}${temp} 已存在, 不需要重新生成文件头, 跳过此文件的创建!!!"
                LOCAL_NOTE_ARR=( ${LOCAL_NOTE_ARR[*]/${temp}} ) # 剔除已经存在的笔记名
            fi
        done
    echo -e "${INFO}正在执行hexo g, 生成文章固定链接,请稍后..."
    hexo g --silent # 编译源码目录，生成文章的固定链接
    echo -e "${INFO}文章的固定十六进制链接已创建..."

    echo -e "${WARN}注意:这里只会将新建的文件的文件头插入到本地笔记开头!!!"
    for temp in ${LOCAL_NOTE_ARR[@]}
        do
            if [ -e "${REMOTE_NOTE_PATH}/${temp}" ];then
                # 将头拷贝到本地笔记中去
                sed -i '1i\\n' ${LOCAL_NOTE_PATH}/${temp}
                sed -i "0r ${temp}" ${LOCAL_NOTE_PATH}/${temp}
            fi
        done
    echo -e "${INFO}本地笔记的已头合并完成..."
}

function note_final_process()
{
    cd ${SCRIPT_ROOT_PATH}
    if ! python -V >/dev/null 2>&1 ; then
    	echo -e "${ERR}未安装python, 请先安装python"
        return
	fi
    echo -e "${INFO}调用python脚本开始处理笔记..."
    for temp in ${PY_WRITE_NOTE_ARR[@]}
        do
            python note_process.py ${LOCAL_NOTE_PATH} ${REMOTE_NOTE_PATH} ${NOTE_RELATIVE_PATH} ${temp}
        done
}

function picture_process()
{
    # 如果远程博客中对应的目录不存在，创建文件夹
    if [ ! -d "${PICTURE_NOTE_PATH}" ]; then
        echo -e "${WARN}${PICTURE_NOTE_PATH} 不存在，即将创建..."
        mkdir -p ${PICTURE_NOTE_PATH}
        echo -e "${INFO}${PICTURE_NOTE_PATH} 创建完成!!!"
    else
        echo -e "${INFO}${PICTURE_NOTE_PATH} 已存在存在，可正常使用..."
    fi

    cp -prf ${LOCAL_NOTE_PATH}/* ${PICTURE_NOTE_PATH}
    cd ${PICTURE_NOTE_PATH}
    echo -e "${INFO}CURRENT_PATH    = $(pwd)"
    find . -name '*.md' -type f -print -exec rm -rf {} \;
    find . -name '*.pptx' -type f -print -exec rm -rf {} \;
    find . -name '*.vsdx' -type f -print -exec rm -rf {} \;
    find . -name 'img' > ${LOCAL_NOTE_ROOT_PATH}/img_path.txt
    # (1) . 表示从当前目录开始递归查找
    # (2) -name '*.md' 根据名称来查找，要查找所有以.md结尾的文件夹或者文件
    # (3) -type f 查找的类型为文件
    # (4) -print 输出查找的文件目录名
    # (5) 最主要的是是-exec了，-exec选项后边跟着一个所要执行的命令，表示将find出来的文件或目录执行该命令。
    #      exec选项后面跟随着所要执行的命令或脚本，然后是一对儿{}，一个空格和一个\，最后是一个分号

}

# 初始化，就是提前做一些操作
function shell_script_init()
{
    traverse_dir ${LOCAL_NOTE_PATH} # 获取要处理的文章的列表
    PY_WRITE_NOTE_ARR=( ${LOCAL_NOTE_ARR[*]} ) # 对于py脚本来说，每一个文件都要重写一遍
    arr_reserve                     # 标签等参数倒序
}

function func_process()
{
	read -p "请选择功能，默认选择退出:" choose
	case "${choose}" in
		"0") 
            note_process
            note_final_process
            ;;
		"1") 
            picture_process;;
		*)  
            exit 0;;
	esac
}

shell_script_init
echo_menu
func_process


